import torch
# 在张量创建时，通过设置 requires_grad 标识为 True 来告诉 PyTorch 需要对该张量进行自动求导， PyTorch 会记录该张量的每一步操作历史并自动计算 。
x=torch.rand(5,5,requires_grad=True)
y=torch.rand(5,5,requires_grad=True)
# PyTorch 会自动追踪和记录对与张量的所有操作，当计算完成后调用 .backward() 方法自动计算梯度并且将计算结果保存到 grad 属性中。
z=torch.sum(x+y)
# 在张量进行操作后，grad_fn 已经被赋予了一个新的函数，这个函数引用了一个创建了这个 Tensor 类的 Function 对象。 
# Tensor 和 Function 互相连接生成了一个非循环图，它记录并且编码了完整的计算历史。每个张量都有个 grad 属性，如果
# 这个张量是用户手动创建的那么这个张量的 grad 是 None 下面我们来调用反向传播函数，计算其梯度。
z.backward()
print(x.grad, y.grad)

z = x**2 + y**3
print(z)
# 我们的返回值不是一个标量，所以需要输入一个大小相同的张量作为参数，这里我们用 ones_like 函数根据 x 生成一个张量；
z.backward(torch.ones_like(x))
print(x.grad)